package org.wdcode.base.util;

import java.io.OutputStream;
import java.util.List;

import org.wdcode.base.bean.EntityBean;
import org.wdcode.common.tools.Conversion;
import org.wdcode.core.tools.ExportXML;
import org.wdcode.core.xml.Document;
import org.wdcode.core.xml.Element;
import org.wdcode.core.xml.XMLFactory;

/**
 * Ajax使用的XML前台输出
 * @author WD
 * @since JDK6
 * @version 1.0 2009-10-30
 */
public final class AjaxExportXML extends ExportXML {
	// 组成标识
	private final static String	XML_ENTITY	= "entity";
	private final static String	XML_KEY		= "key";
	private final static String	XML_VALUE	= "value";

	/**
	 * 根据列表组成Map
	 * @param lists 列表
	 */
	public final static <E extends EntityBean> void exportXML(OutputStream out, List<E>... lists) {
		writeXml(out, getDocumentByLists(lists));
	}

	/**
	 * 根据列表获得文档对象
	 * @param lists 列表
	 * @return 文档
	 */
	private static <E extends EntityBean> Document getDocumentByLists(List<E>... lists) {
		// 获得Document
		Document doc = createDocument();
		// 获得根节点
		Element root = doc.getRootElement();
		// 循环数组
		for (int i = 0; i < lists.length; i++) {
			// 获得组合后的文档对象
			root = getDocumentByList(root, i, lists[i]);
		}
		// 返回文档
		return doc;
	}

	/**
	 * 根据列表获得文档对象
	 * @param doc 文档
	 * @param num 第几个
	 * @param list 列表
	 * @return 文档
	 */
	private static <E extends EntityBean> Element getDocumentByList(Element root, int num, List<E> list) {
		// 声明E 保存临时变量
		E entity = null;
		// 声明Element保存临时变量
		Element element = null;
		// 保存临时数量
		int size = list.size();
		// 保存临时实体key
		String entityKey = XML_ENTITY + num;
		// 循环列表
		for (int i = 0; i < size; i++) {
			// 获得E
			entity = list.get(i);
			// 获得Element
			element = XMLFactory.createElement(entityKey);
			// 组成XML
			element.addElement(XML_KEY, Conversion.toString(entity.getId()));
			element.addElement(XML_VALUE, entity.getName());
			// 添加到根节点
			root.add(element);
		}
		// 返回根节点
		return root;
	}

	/**
	 * 私有构造，禁止外部实例化
	 */
	private AjaxExportXML() {}
}
